package com.bjpowenode.java;

import java.awt.geom.FlatteningPathIterator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author wuyuecai
 * @create 2021-05-30 14:11
 */
public class BloodSuckerNums {
    /*
   写一个程序，找出4位数的所有吸血鬼的数字
   例如1260=21*60
     1827=21*87
    */
    public static void main(String[] args) {
        System.out.println("4位数的所有吸血鬼的数字有：");
        for (int num = 1001; num < 10000; num++) {
            math(num);
        }
    }

    private static boolean math(int num) {
        int[] temp1 = new int[2];//存放num中拆分的两个数字
        int[] temp2 = new int[2];//存放num中拆分的与temp1不同的两个数字
        int a = num/1000;//千位数字
        int b = num/100%10;//百位数字
        int c = num/10%10;//十位数字
        int d = num%10;//个位数字
        int[] data = {a,b,c,d};//将各个位的数字存入data数组中
        //取出data数组中的元素组成两位数进行相乘，但是两位数中的数字不能重复例如：不能取12*21
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data.length; j++) {
                //如果两个元素的下标相同则跳过，不能取相同元素的值
                if(i == j){
                    continue;
                }
                //将前两个元素取出放到temp1数组中
                temp1[0] = data[i];
                temp1[1] = data[j];
                //取剩下两个元素
                for (int k = 0; k < data.length; k++) {
                    //第三个元素不能和前两个元素重复
                    if(k != i && k != j){
                        temp2[0] = data[k];
                        for (int l = 0; l < data.length; l++) {
                            if(l != i && l != j && l != k) {
                                temp2[1] = data[l];
                                if(multi(data, temp1, temp2)){
                                    return true;
                                }

                            }
                        }
                    }

                }
            }
        }
        return false;
    }
    //multi方法是判断num是否等于其中的数字组成的两位数的乘积
    private static boolean multi(int[] data, int[] temp1, int[] temp2) {
        int i = toInit(temp1);
        int j = toInit(temp2);
        int k = toInit(data);
        if(k == i*j){
            System.out.println(k);
            return true;
        }
        return false;
    }
    //用于将temp1、temp2、data数组中的分别存储的数字重新组成两位数或者四位数
    private static int toInit(int[] temp) {
        int m = 0;
        int[] temp1 = new int[temp.length];
        //将个位，十位，百位，千位的数字转换成对应的的数字，例如，将1转换成千位数字那就变成1*1000=1000，
        //将3转换成百位数字，3*100=300等等
        for (int i = 0; i < temp.length; i++) {
            temp1[i] = temp[i]*(int) Math.pow(10,temp.length-1-i);
        }
        //将转换之后的数字相加得到相应的数字，例如：1000+200+60+0=1260
        for (int i = 0; i < temp1.length; i++) {
            m += temp1[i];
        }
        return m;
    }
}
